/**
 * 深拷贝 浅拷贝
 * Object.assign : 对复杂对象 直接指向地址.浅拷贝
 * */
let target = {
  c:{
    age:12
  }
}
let source = {
  a:1,
  b:2,
  c:{
    name:'aqie'
  }
}
Object.assign(target, source)
console.log(target)

// 深拷贝 两个值不互相影响
let a = 5
let b = a
a = 6
console.log(a, b) // 6 5 


// 浅拷贝, 值彼此影响
let obj = {
  'name':'aqie',
  'age':20
}
let obj2 = obj
obj2.age = 18
obj.name = 'bqie'
console.log(obj, obj2)


// JSON 本质是字符串 ，key 必须带引号对象不需要
// JSON.stringfy() JSON.parse()

let obj3 = JSON.parse('{"a":"hello","b":"world"}')
let str = JSON.stringify(obj3)

// 对象深拷贝1
let deepObj = JSON.parse(JSON.stringify(obj))
obj.name='aqie'
console.log(obj, deepObj)

// 对象深拷贝2

// 判断传入data 类型  typeof 只能判断基本数据类型 不能判断引用数据类型
let checkType = data=>{
  return Object.prototype.toString.call(data).slice(8,-1) // 从第八个开始 最后一个字符也不要
}

let deepClone = target => {
  let targetType = checkType(target)
  let result
  if(targetType === 'Object'){
    result = {}
  } else if(targetType === 'Array'){
    result = []
  } else {
    return targetType
  }
  // 循环遍历
  for(let i in target) {
    let value = target[i]
    let valueType = checkType(value)
    if(valueType === 'Object' || valueType === 'Array') {
        result[i] = deepClone(value)
    } else {
      result[i] = value
    }
  }
  return result
}

let arr = [1,2,3,{a:10},[4,5]]
let arrDeep = deepClone(arr)
arr = arr.slice(1,2)
console.log(arr, arrDeep)